const cloud = require('wx-server-sdk');
cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV });
const ddbb = cloud.database();
const _ = ddbb.command;

exports.main = async (event, context) => {
  const wxContext = cloud.getWXContext();
  const openID = wxContext.OPENID;
  const { groupID, code, isCheckIn } = event;

  // 开启事务
  const transaction = await ddbb.startTransaction();

  try {
    // 读取分组信息（带事务）
    const groupRes = await transaction.collection('Activity_Group_Information')
      .where({ _id: groupID })
      .field({
        CheckInCodeOrURL: true,
        IsCheckInActive: true,
        CheckOutCodeOrURL: true,
        IsCheckOutActive: true
      })
      .get();

    if (!groupRes.data || groupRes.data.length === 0) {
      await transaction.rollback();
      return { success: false, error: "未找到该分组信息" };
    }

    const info = groupRes.data[0];

    // 校验签到 / 签退口令与时间
    if (isCheckIn) {
      if (code !== info.CheckInCodeOrURL) {
        await transaction.rollback();
        return { success: false, error: "签到口令不正确！" };
      }
      if (!info.IsCheckInActive) {
        await transaction.rollback();
        return { success: false, error: "当前不在签到时间段！" };
      }
    } else {
      if (code !== info.CheckOutCodeOrURL) {
        await transaction.rollback();
        return { success: false, error: "签退口令不正确！" };
      }
      if (!info.IsCheckOutActive) {
        await transaction.rollback();
        return { success: false, error: "当前不在签退时间段！" };
      }
    }

    // 检查报名记录是否存在
    const regRes = await transaction.collection('Group_Registration_Information')
      .where({ OpenID: openID, GroupID: groupID })
      .get();

    if (!regRes.data || regRes.data.length === 0) {
      await transaction.rollback();
      return { success: false, error: "未找到该用户报名信息" };
    }

    const record = regRes.data[0];

    // 检查是否重复签到 / 签退
    if (isCheckIn && record.IsCheckedIn) {
      await transaction.rollback();
      return { success: false, error: "您已签到，请勿重复操作！" };
    }
    if (!isCheckIn && record.IsCheckedOut) {
      await transaction.rollback();
      return { success: false, error: "您已签退，请勿重复操作！" };
    }

    // 更新签到 / 签退状态（事务内执行）
    const updateData = isCheckIn
      ? { IsCheckedIn: true, CheckInTime: Date.now() }
      : { IsCheckedOut: true, CheckOutTime: Date.now() };

    await transaction.collection('Group_Registration_Information')
      .where({ OpenID: openID, GroupID: groupID })
      .update({ data: updateData });

    // 提交事务（所有成功）
    await transaction.commit();

    return { success: true, error: "" };

  } catch (err) {
    // 出错则回滚
    await transaction.rollback();
    return { success: false, error: err.message || err };
  }
};
